package com.maiko.maikoaiagent.agent;

import com.maiko.maikoaiagent.advisor.MyLoggerAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.stereotype.Component;

/**
 * MaikoManus 是基于 ToolCallAgent 的具体智能代理实现类。
 * 它代表一个拥有多种工具能力的 AI 助手，能够根据用户的需求自动选择工具来完成复杂任务。
 * <p>
 * 特性包括：
 * - 支持多工具调用与组合工具调用
 * - 可根据任务复杂度进行多轮分解执行
 * - 内置终止机制：支持使用 `terminate` 工具主动结束对话
 * - 使用 DashScope ChatModel + Spring AI ChatClient 实现对话驱动
 *
 * @author: Maiko7
 * @create: 2025-07-10 7:52
 */

@Component
public class MaikoManus extends ToolCallAgent {

    /**
     * 构造函数，初始化 MaikoManus 智能体
     *
     * @param allTools 所有可用的工具（通过 ToolCallback 实现）
     * @param dashscopeChatModel 使用的语言模型（如 DashScope、OpenAI 等）
     */
    public MaikoManus(ToolCallback[] allTools, ChatModel dashscopeChatModel) {
        super(allTools);

        // 设置代理名称（用于日志、标识）
        this.setName("maikoManus");

        // 系统提示词：定义 AI 的角色和能力
        String SYSTEM_PROMPT = """
                You are MaikoManusManus, an all-capable AI assistant, aimed at solving any task presented by the user.
                You have various tools at your disposal that you can call upon to efficiently complete complex requests.
                """;
        this.setSystemPrompt(SYSTEM_PROMPT);

        // 下一步提示词：指导每一轮如何选择工具与继续行动
        String NEXT_STEP_PROMPT = """
                Based on user needs, proactively select the most appropriate tool or combination of tools.
                For complex tasks, you can break down the problem and use different tools step by step to solve it.
                After using each tool, clearly explain the execution results and suggest the next steps.
                If you want to stop the interaction at any point, use the `terminate` tool/function call.
                """;
        this.setNextStepPrompt(NEXT_STEP_PROMPT);

        // 最大执行步数（多轮调用防死循环）
        this.setMaxSteps(20);

        // 初始化语言模型客户端，并添加日志拦截器
        ChatClient chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MyLoggerAdvisor()) // 自定义日志记录器
                .build();
        this.setChatClient(chatClient);
    }
}


